<?php

/**

 * 管理登录逻辑层

 * @author maniac

 */

namespace app\common\logic;



use app\common\model\LoginFail;

use app\common\model\Members;
use app\common\model\Users;

use app\facade\UserLogs;

use app\facade\Aes;



class Login

{

    /**

     * 管理员登录逻辑处理

     * @param array $data 请求的数据

     */

    public function login($data)

    {

        if (!isset($data['username']) || !isset($data['password']) || !isset($data['code'])) {

            exception('非法请求');

        }

        if (!trim($data['username'])) {

            exception('请输入用户名');

        }

        if (!trim($data['password'])) {

            exception('请输入密码');

        }

        if (!trim($data['code'])) {

            exception('请输入验证码');

        }

        

        // 加密密钥

        $encrypt_key = session('encrypt_key', '', session_prefix());

        // 解密

        $username    = Aes::decrypt($data['username']);

        $password    = Aes::decrypt($data['password']);

        $code        = Aes::decrypt($data['code']);

        

        // 检查验证码

        $captcha     = new \think\captcha\Captcha();

        if (!$captcha->check($code)) {

            exception('验证码错误');

        }

        

        // 获取登录失败次数

        $this->getFailedNums();

        

        $user = Users::field('id,role_id,username,password,login_nums,last_login_ip,last_login_time,salt,status')->where('username', $username)->find();

        if (!$user) {

            // 登录失败

            $this->loginFail();

            exception('用户不存在');

        }

        

        if (salt_pass($password, $user['salt']) != $user['password']) {

            // 登录失败

            $this->loginFail();

            exception('密码错误');

        }

        

        if (!$user['status']) {

            exception('您的账号已被禁用，请联系系统管理员');

        }

        if($this->loginSuccess($user)) {

            return true;

        }

        exception('未知错误');

    }
	/**
	 * 管理员登录逻辑处理
	 * @param array $data 请求的数据
	 */
	public function shop($data)
	{
		if (!isset($data['username']) || !isset($data['password']) || !isset($data['code'])) {
			exception('非法请求');
		}
		if (!trim($data['username'])) {
			exception('请输入用户名');
		}
		if (!trim($data['password'])) {
			exception('请输入密码');
		}
		if (!trim($data['code'])) {
			exception('请输入验证码');
		}

		// 加密密钥
		$encrypt_key = session('encrypt_key', '', session_prefix());
		// 解密
		$username    = Aes::decrypt($data['username']);
		$password    = Aes::decrypt($data['password']);
		$code        = Aes::decrypt($data['code']);

		// 检查验证码
		$captcha     = new \think\captcha\Captcha();
		if (!$captcha->check($code)) {
			exception('验证码错误');
		}

		// 获取登录失败次数
		$this->getFailedNums();

		$user = Members::field('id,role_id,username,password,login_nums,last_login_ip,last_login_time,salt,status')->where('username', $username)->where('is_stores',1)->find();
		if (!$user) {
			// 登录失败
			$this->loginFail();
			exception('用户不存在');
		}

		if ($data['password'] != $user['password']) {
			// 登录失败
			$this->loginFail();
			exception('密码错误');
		}

		if (!$user['status']) {
			exception('您的账号已被禁用，请联系系统管理员');
		}
		if($this->loginMemberSuccesss($user)) {
			return true;
		}
		exception('未知错误');
	}
    

    /**

     * 获取登录失败次数

     */

    private function getFailedNums()

    {

        $where = [

            ['update_time', 'elt', time() - config('system.login_time')*60],

        ];

        // 删除过期登录失败次数

        LoginFail::where($where)->delete();

        $info = LoginFail::field('login_nums')->where('ip', request()->ip())->find();

        if ($info['login_nums'] >= config('system.login_nums')) {

            exception('登录失败次数超出限制，请'.config('system.login_time').'分钟后重试！');

        }

    }

    

    /**

     * 登录失败

     */

    private function loginFail()

    {

        $info = LoginFail::field('id,login_nums')->where('ip', request()->ip())->find();

        if ($info) {

            $info->login_nums = ['inc', 1];

            $info->save();

        } else {

            LoginFail::create([

                'login_nums' => 1,

            ]);

        }

    }

    

    /**

     * 登录成功

     * @param  array $user 登录用户信息

     */

    private function loginSuccess($user)

    {

        // 更新用户登录信息

        $rnd = unid(8);

        Users::update([

            'id'              => $user['id'],

            'login_nums'      => $user['login_nums'] + 1,

            'last_login_ip'   => request()->ip(),

            'last_login_time' => time(),

            'rnd'             => $rnd,

        ]);

        

        // 设置 session

        $prefix = session_prefix();

        session('userid', $user['id'], $prefix);

        session('username', $user['username'], $prefix);

        session('role_id', $user['role_id'], $prefix);

        session('login_nums', $user['login_nums'], $prefix);

        session('last_login_ip', $user['last_login_ip'], $prefix);

        session('last_login_time', $user['last_login_time'], $prefix);

        session('rnd', $rnd, $prefix);

        $log = [

            'title'   => '管理员登录',

            'content' => '',

        ];

        return UserLogs::insertLog($log);

    }
	/**
	 * 登录成功
	 * @param  array $user 登录用户信息
	 */
	private function loginMemberSuccesss($user)
	{
		// 更新用户登录信息
		$rnd = unid(8);
		Members::update([
			'id'              => $user['id'],
			'login_nums'      => $user['login_nums'] + 1,
			'last_login_ip'   => request()->ip(),
			'last_login_time' => time(),
			'rnd'             => $rnd,
		]);

		// 设置 session
		$prefix = session_prefix();
		session('userid', $user['id'], $prefix);
		session('username', $user['username'], $prefix);
		session('role_id', $user['role_id'], $prefix);
		session('login_nums', $user['login_nums'], $prefix);
		session('last_login_ip', $user['last_login_ip'], $prefix);
		session('last_login_time', $user['last_login_time'], $prefix);
		session('rnd', $rnd, $prefix);
		$log = [
			'title'   => '商户登录',
			'content' => '',
		];
		return UserLogs::insertLog($log);
	}

}

